package org.example.study5;
// 多线程环境下线程安全累加操作
public class Demo_501 {
    public static void main(String[] args) throws InterruptedException {
        // 初始化累加对象
        Counter501 counter = new Counter501();

        // 创建两个线程对同一个变量进行累加
        Thread t1 = new Thread(() -> {
            // 循环5万次累加
            for (int i = 0; i < 50000; i++) {
                counter.increase(); // 调用线程安全的累加方法
            }
        });

        // 线程2与线程1逻辑相同
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                counter.increase();
            }
        });

        // 启动线程
        t1.start();
        t2.start();

        // 等待两个线程执行完毕
        t1.join();
        t2.join();

        // 输出最终结果
        System.out.println("count = " + Counter501.count); // 预期结果应为100000
    }
}

class Counter501 {
    // 静态共享变量，初始值为0
    public static int count = 0;

    /**
     * 累加方法：通过同步方法确保线程安全
     */
    public synchronized void increase() {
        increase1(); // 调用链中的方法均通过同步控制
    }

    private synchronized void increase1() {
        increase2();
    }

    private void increase2() {
        // 模拟复杂逻辑后，最终在同步块中执行累加
        synchronized (this) { // 使用实例对象作为锁，与同步方法锁一致
            count++; // 原子性操作，确保线程安全
        }
    }
}

// 运行： count = 100000

/*关键设计
synchronized方法：increase()和increase1()通过synchronized修饰，锁定当前实例对象（this）。
嵌套同步块：increase2()使用synchronized (this)显式同步块，锁对象与同步方法一致。
可重入锁：Java的synchronized锁是可重入的，同一线程可多次获取同一锁，避免死锁。

线程安全机制
所有对count的操作均在同步代码块中，确保原子性。
由于使用同一个Counter501实例（counter），所有线程竞争的是同一把锁（this），保证操作的互斥性。*/

/*总结
代码核心：通过多层同步调用演示线程安全的累加操作。
实际应用：在需要多线程共享资源的场景（如计数器、状态标记等），需通过同步机制保证数据一致性。
注意事项：若共享变量为静态变量，需确保所有操作使用同一锁（如类锁或唯一实例锁）。*/

/*synchronized
1.可以保证原子性
2.在保证原子性的基础上实现了内存可见性
3.不保证有序性（指令重排序）*/
